.TITLE DRSPW .IDENT /14.09/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; M. S. FOX 21-MAY-81 ; ; THIS MODULE WAS ORIGINALLY WRITTEN BY T. J. MILLER ON 26-MAY-77 ; AND HAS BEEN PREVIOUSLY MODIFIED BY: ; ; R. E. CALDWELL ; B. S. MCCARTHY ; T. J. MILLER ; J. E. PROVINO ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; J. M. LAWLER ; T. M. MARTIN ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; B. S. MCCARTHY ; J. W. BERZLE ; J. R. KAUFFMAN ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; J. W. BERZLE ; P. K. M. WEISS ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ; ; B. S. MCCARTHY 9-JAN-92 14.09 ; ; BM433 -- INTEGRATE DAVE CARROLL'S CHANGE ; (CORRECTS PASSAIC PROBLEM) ; ; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINES ; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT. ; ; MACRO LIBRARY CALLS ; .MCALL DCBDF$,PKTDF$,TCBDF$,UCBDF$ .IF DF N$$DIR .MCALL LNMDF$ LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS .ENDC ;DF N$$DIR DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS PKTDF$ ;DEFINE I/O PACKET AND OCB OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS UCBDF$ ;DEFINE UNIT CONTROL BLOCK SYMBOLS ;+ ; **-$DRSRC-SEND REQUEST AND CONNECT / VARIABLE SEND REQUEST AND CONNECT / ; SEND REQUEST AND PASS OCB ; ; SRDC$ ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FOR ; THE SPECIFIED TASK, CONNECT TO THE TASK AND REQUEST IT IF IT IS NOT ; ALREADY ACTIVE. ; ; DPB FORMAT: (FOR SDRC$) ; ; WD. 00 -- DIC(141.),DPB SIZE(7.). ; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. ; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50. ; WD. 03 -- ADDRESS OF SEND BUFFER. ; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). ; WD. 05 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN. ; WD. 06 -- ADDRESS OF EXIT STATUS BLOCK. ; ; VSRC$ ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A VARIABLE LENGTH ; SEND DATA PACKET FOR THE SPECIFIED TASK, CONNECT TO THE TASK AND ; REQUEST IT IF IT IS NOT ALREADY ACTIVE. ; ; DPB FORMAT: (FOR VSRC$) ; ; WD. 00 -- DIC (141.),DPB SIZE(8.). ; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. ; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50. ; WD. 03 -- ADDRESS OF SEND BUFFER. ; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). ; WD. 05 -- LENGTH OF SEND BUFFER. ; WD. 06 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN. ; WD. 07 -- ADDRESS OF EXIT STATUS BLOCK. ; ; SDRP$ ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FOR ; THE SPECIFIED TASK, UNLINK ALL OR A SELECTED OCB FROM THE CURRENT ; TASK, LINK THE OCB(S) OFF THE SPECIFIED TASK, AND REQUEST IT IF IT ; IS NOT ALREADY ACTIVE. ; ; DPB FORMAT: (FOR SDRP$) ; ; WD. 00 -- DIC(141.),DPB SIZE(9.) ; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50 ; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50 ; WD. 03 -- ADDRESS OF SEND BUFFER ; WD. 04 -- EFN, FLAGS BYTE ; WD. 05 -- LENGTH OF SEND BUFFER (DEFAULT = 13.) ; WD. 06 -- FIRST HALF OF NAME OF PARENT WHOSE OCB SHOULD BE PASSED ; WD. 07 -- SECOND HALF OF PARENT'S TASK NAME ; WD. 08 -- ADDRESS OF OCB TO PASS (CLI TASKS ONLY) ; ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TARGET TASK. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK. ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE SEND BUFFER ADDRESS IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; ; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND ; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCB ; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE ; TASK HEADER IS MAPPED. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; ; FOR SDRC$ AND VSRC$ ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND ; PACKET, OFFSPRING CONTROL BLOCK , TASK ; CONTROL BLOCK OR PARTITION CONTROL BLOCK COULD ; NOT BE ALLOCATED. ; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF IT IS ILLEGAL ; TO SEND TO THE TARGET TASK. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID ; EVENT FLAG NUMBER IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT ; STATUS BLOCK IS NOT ENTIRELY WITHIN THE USER'S ; SPACE. ; ; THE SDRP$ DIRECTIVE CON RETURN ALL OF THE ABOVE ERRORS, PLUS THE ; FOLLOWING THREE: ; ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETER ; RESERVED FOR A LCI ONLY IS USED BY A NON-CLI TASK ; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLI ; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE IS ; NO OCB FROM THE SPECIFIED PARENT ; DIRECTIVE STATUS OR 'D.RS84' IS RETURNED IF A CLI TASK ; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS, ; AND THE TWO DO NOT IDENTIFY THE SAME OCB, ; OR EITHER FIELD IS SUPPLIED WITH THE FLAG TO ; PASS ALL OCBS ;- $DRSRC::MOV R3,R1 ;COPY DPB ADDRESS TO SAVE MOV SP,$TEMP3 ;SAVE SP TO FACILITATE POSSIBLE UNWIND CMPB $DICSV+1,#5 ;IS THIS ILLEGAL DPB LENGTH SPECIFIED BEQ ILLDPB ;IF EQ YES, NOTE THAT $DRSND VALIDATES ;DPB LENGTH FOR OTHER VALUES CALL ERRSV ;PUSH CONTEXT TO REVERSE SEND OPERATION .WORD NULL ;NO ROUTINE TO CALL NOW .WORD 10$ ;ADDRESS OF RECOVERY ROUTINE .IF DF X$$HDR MOV $SAHPT,R4 ;RESTORE TASK HEADER ADDRESS .IFF MOV $HEADR,R4 ;RESTORE TASK HEADER ADDRESS .ENDC CALL $DRSND ;PERFORM SEND OPERATION MOV 4(SP),R3 ;RESTORE DPB ADDRESS TST (R3)+ ;POINT TO EVENT FLAG WORD CMPB $DICSV+1,#9. ;IS IT AN SDRP$ DIRECTIVE BEQ 20$ ;IF EQ YES BR CNRQT ;CONNECT AND REQUEST TASK ; ; CODE TO REMOVE SEND PACKET FROM RECEIVERS QUEUE ON ERROR ; 10$: ADD #T.RCVL,R0 ;POINT TO TARGET TASK RECEIVE QUEUE MOV 2(R0),R1 ;GET ADDRESS OF PACKET JUST QUEUED CALL $GTSPK ;REMOVE IT FROM THE QUEUE MOV R1,R0 ;COPY POINTER TO PACKET MOV R0,KISAR6 ;MAP SEND PACKET MOV @#140002,R1 ;GET NUMBER OF WORDS SENT ADD #<6.+37>,R1 ;ALLOW FOR EXTRA CONTROL WORDS ASH #-5,R1 ;CONVERT TO 32 WORD BLOCKS CALLR $DESEC ;DEALLOCATE THE PACKET ; ; LOCATE EXISTING OCB(S) FOR SDRP$ DIRECTIVE ; 20$: MOVB 1(R3),R2 ;GET FLAGS BYTE, DOES IT FORCE EXIT?? BMI 30$ ;IF MI YES MOV #1,$TEMP3 ;DON'T FORCE EXIT, BUT IT IS AN SDRP$ 30$: CMP (R3)+,(R3)+ ;POINT TO PARENT NAME FIELDS CALL LOCOCB ;LOCATE OCB(S) TO PASS MOV $TKTCB,R5 ;SET TCB ADDRESS JMP STRTSK ;REQUEST TASK ;+ ; **-$DRCNC-CONNECT TO TASK ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT THE ISSUING TASK TO ; THE SPECIFIED (ACTIVE) TARGET TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(143.),DPB SIZE(6.). ; WD. 01 -- FIRST WORD OF TASK NAME IN RAD50. ; WD. 02 -- SECOND WORD OF TASK NAME IN RAD50. ; WD. 03 -- EFN, LENGTH OF ESB (DEFAULT=2). ; WD. 04 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS. ; WD. 05 -- ADDRESS OF THE EXIT STATUS BLOCK. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TARGET TASK. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK. ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE EVENT FLAG NUMBER IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN OFFSPRING ; CONTROL BLOCK COULD NOT BE ALLOCATED. ; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT IS ; BEING MADE TO CONNECT TO A CLI TASK. ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE TARGET ; TASK IS NOT ACTIVE. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID ; EVENT FLAG NUMBER IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT ; STATUS BLOCK IS NOT ENTIRELY IN THE USER'S ; SPACE. ;- $DRCNC::MOV #ERRSV,-(SP) ;PUSH ADDRESS OF ERROR SAVE ROUTINE TST (R1) ;IS TARGET TASK ACTIVE? BMI 10$ ;IF MI NO BIT #T3.CLI,T.ST3(R0) ;TARGET TASK A CLI? BEQ CNRQT ;IF EQ NO DRSTS D.RS2 ;CONNECTING TO CLI TASK 10$: DRSTS D.RS7 ;SPECIFIED TASK NOT ACTIVE ;+ ; **-$DRREQ-REQUEST, SPAWN, OR CHAIN TO A TASK ; ; THIS ROUTINE INSTRUCTS THE SYSTEM TO REQUEST, SPAWN, OR CHAIN TO THE ; SPECIFIED TASK, DEPENDING ON THE DPB SIZE. IF THE DIRECTIVE IS RPOI$, ; THE TASK IS CHAINED TO BY UNLINKING ALL OR A SELECTED OCB ; FROM THE CURRENT TASK, AND LINKING IT TO THE TARGET TASK. THIS ; DIFFERS FROM SPWN$ IN THAT NO NEW OCB IS CREATED. ; ; DPB FORMAT: (FOR SPAWN OR REQUEST) ; ; WD. 00 -- DIC(11.),DPB SIZE(7., 13., OR 14.). ; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. ; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50. ; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED. ; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED. ; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED. ; WD. 06 -- REQUEST UIC. ; WD. 07 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). ; WD. 08 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS. ; WD. 09 -- EXIT STATUS BLOCK ADDRESS. ; WD. 10 -- ADDRESS OF COMMAND LINE TO QUEUE FOR TARGET TASK. ; WD. 11 -- LENGTH OF COMMAND LINE. ; WD. 12 -- VIRTUAL TERMINAL UNIT NUMBER FOR TI:. ; WD. 13 -- ASCII DEVICE NAME (OPTIONAL FIELD) ; ; DPB FORMAT: (FOR RPOI$) ; ; WD. 00 -- DIC (11.),DPB SIZE(16.) ; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. ; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50. ; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED. ; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED. ; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED. ; WD. 06 -- REQUEST UIC. ; WD. 07 -- FIRST HALF OF NAME OF PARENT,WHOSE OCB SHOULD BE PASSED. ; WD. 08 -- SECOND HALF OF NAME OF PARENT. ; WD. 09 -- ADDRESS OF OCB TO PASS (CLI TASK ONLY). ; WD. 10 -- ADDRESS OF COMMAND BUFFER. ; WD. 11 -- LENGTH OF COMMAND BUFFER. ; WD. 12 -- UNIT NUMBER OF TASK TI:, FLAGS BYTE. ; WD. 13 -- ASCII DEVICE NAME FOR TI:. ; WD. 14 -- FIRST HALF OF NAME TO BE USED FOR NEW TASK IN RAD50. ; WD. 15 -- SECOND HALF OF NAME TO BE USED FOR NEW TASK IN RAD50. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TARGET TASK. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK. ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE PARTITION NAME WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATION ; FAILURE OCCURS ON A PARTITION CONTROL BLOCK, ; OFFSPRING CONTROL BLOCK, COMMAND LINE BUFFER, ; OR A TASK CONTROL BLOCK. ; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT IS ; MADE TO ISSUE A SPAWN TO A COMMAND LINE INTER- ; PRETER WITHOUT SPECIFYING A COMMAND LINE. ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED ; TASK IS ALREADY ACTIVE (WITH EXCEPTION OF A ; SPAWN TO A COMMAND LINE INTERPRETER). ; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN INVALID ; VIRTUAL TERMINAL UNIT IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID ; EVENT FLAG NUMBER IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT ; STATUS BLOCK OR THE COMMAND LINE IS NOT ENTIRELY ; IN THE TASK'S ADDRESSING SPACE. ; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGAL ; DPB SIZE IS SPECIFIED (NOT 7. OR 13.). ; ; THE ABOVE ERRORS ALSO APPLY TO THE RPOI$ DIRECTIVE, EXCEPT FOR 'D.RS97' ; WHICH IT CANNOT RETURN. THE RPOI$ DIRECTIVE CAN ALSO RETURN THE ; FOLLOWING ERRORS. ; ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETER ; RESERVED FOR A CLI ONLY IS USED BY A NON-CLI TASK ; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLI. ; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE IS ; NO OCB FROM THE SPECIFIED PARENT. ; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF A CLI TASK ; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS, ; AND THE TWO DO NOT IDENTIFY THE SAME OCB, OR ; EITHER FIELD IS SUPPLIED WITH THE FLAG ; REQUESTING ALL OCBS TO BE PASSED. ;- .ENABL LSB $DRREQ::MOV SP,$TEMP3 ;SAVE CURRENT STACK TO EASE UNWIND CALL ERRSV ;INITIALIZE ERROR RECOVERY .WORD NULL ;NO IMMEDIATE ACTION .WORD NULL ;NO RECOVERY ACTION ADD #6,R3 ;POINT TO UIC WORD IN DPB MOV (R3)+,R4 ;PICK UP SPECIFIED UIC FOR REQUEST CMPB $DICSV+1,#7. ;IS THIS A SIMPLE REQUEST? BNE 5$ ;IF NE NO MOV T.UCB(R5),R5 ;GET TARGET UCB ADDR CLR $TEMP3 ;NOT AN RPOI$ JMP RQST2 ;DO REQUEST PROCESSING 5$: CMPB $DICSV+1,#13. ;IS IT A VALID SPAWN REQUEST? BEQ CNRQT ;IF EQ YES CMPB $DICSV+1,#14. ;IS IT A SPAWN REQUEST WITH TI SPECIFIED BEQ CNRQT ;IF EQ YES CMPB $DICSV+1,#16. ;IS IT AN RPOI$ BNE 10$ ;IF NE NO MOVB 13(R3),R2 ;GET FLAGS BYTE, SHOULD EXIT BE FORCED? BMI 7$ ;IF MI YES MOV #1,$TEMP3 ;NO FORCED EXIT, BUT REMEMBER THIS IS RPOI$ 7$: CALL LOCOCB ;LOCATE OCB(S) TO PASS ADD #6,R3 ;POINT TO COMMAND BUFFER ADDR IN DPB BR 35$ ;JOIN COMMON CODE 10$: MOV (PC)+,R5 ;ASSUME ILLEGAL DPB SIZE ILLDPB: DRSTS D.RS99 ; 15$: JMP ERROR ; PROCESS THE ERROR IN R5 ; ; CONNECT PROCESSING (CNCT, SDRC, SPWN, VSRC). ; ; COMMON CONNECT AND REQUEST PROCESSING BEGINS HERE FOR REQUEST/SPAWN, ; CONNECT, AND (VARIABLE) SEND REQUEST AND CONNECT DIRECTIVES. THE FOLLOWING ; SECTION PERFORMS THE CONNECT PROCESSING. AN OFFSPRING CONTROL BLOCK ; IS ALLOCATED TO BE QUEUED TO THE OFFSPRING TASK'S OCB QUEUE. THEN THE ; EVENT FLAG AND EXIT STATUS BLOCK PARAMETERS ARE CHECKED AS THE OFF- ; SPRING CONTROL BLOCK IS INITIALIZED. IF AN OCB IS SUCCESSFULLY ; ALLOCATED, ITS ADDRESS IS STORED IN $TEMP1 AS A FLAG THAT IT MUST BE ; QUEUED TO THE TARGET TASK ON SUCCESSFUL EXIT. ; ; ; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND ; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCB ; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE ; TASK HEADER IS MAPPED. ; ; REGISTER CONTENTS AT THIS POINT: ; ; R3=PTR TO THE EVENT FLAG NUMBER IN THE DPB. ; CNRQT: CLR $TEMP3 ;NOT AN RPOI$ OR SDRP$ DIRECTIVE MOV #O.LGTH,R1 ;PICK UP OCB SIZE CALL @(SP)+ ;ALLOCATE OCB WITH TRAIL TO DEALLOCATE .WORD $ALOCB ;ALLOCATION ROUTINE ADDRESS .WORD DEOCB ;DEALLOCATION ROUTINE ADDRESS BCC 20$ ;IF CC ALLOCATION SUCCESSFUL JMP ALLER ;ELSE REPORT ALLOCATION FAILURE 20$: MOV R0,$TEMP1 ;STORE OCB ADDRESS FOR CONNECT .IF DF N$$DIR CLR O.STAT+10(R0) ; INSURE THAT THE CONTEXT BLOCK IS ZERO ; SO ERROR RECOVERY DOESN'T DECREMENT RANDOM ; LOCATIONS IN MEMORY .ENDC ;DF,N$$DIR MOV (PC)+,R5 ;ASSUME INVALID EVENT FLAG NUMBER DRSTS D.RS97 ; MOV R0,R4 ;COPY OCB POINTER MOVB (R3)+,R0 ;PICK UP SPECIFIED EVENT FLAG CMP R0,#96. ;VALID EVENT FLAG NUMBER? BHI 15$ ;IF HI NO CMP R0,#64. ;IS IT A GROUP GLOBAL EVENT FLAG? .IF DF G$$GEF BLOS 25$ ;IF LOS NO MOV R4,-(SP) ;SAVE R4 .IF DF X$$HDR MOV KISAR6,-(SP) ;SAVE KERNEL APR6 MAPPING MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFF MOV $HEADR,R4 ;GET ADDRESS OF CURRENT TASK'S HEADER .IFTF MOVB H.CUIC+1(R4),R4 ;GET CUURRENT TASK'S GROUP NUMBER .IFT MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPING .ENDC MOV R0,-(SP) ;SAVE R0 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS MOV (SP)+,R0 ;RESTORE R0 MOV (SP)+,R4 ;RESTORE R4 BCS 15$ ;IF CS, INVALID EVENT FLAG SPECIFIED .IFF ; DF G$$GEF BHI 15$ ;INVALID EVENT FLAG SPECIFIED .ENDC ; DF G$$GEF 25$: MOV $TKTCB,R5 ;PICK UP CURRENT TASK TCB ADDRESS MOV R0,-(SP) ;SAVE EVENT FLAG NUMBER CALL $CEFIG ;CONVERT EVENT FLAG TO MASK AND ADDRESS BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR BIC R0,(R1) ;CLEAR EVENT FLAG TST (R4)+ ;SKIP OVER OCB LINK WORD (O.LNK) CLR (R4)+ ;INITIALLY CLR MCR LINE PTR (O.MCRL) MOV R5,(R4)+ ;SET PARENT TCB ADDRESS (O.PTCB) MOV #2,R1 ;ASSUME 1 WORD EXIT STATUS BLOCK CLR R0 ;DITTO TSTB (R3)+ ;WAS IT A 1 WORD EXIT STATUS BLOCK ? BEQ 27$ ;IF EQ YES MOV #8.*2,R1 ;DEFAULT SIZE TO 8 WORDS INC R0 ;SET FULL ESB FLAG 27$: CMPB $DICSV+1,#8. ;IS THIS A VSRC$ DIRECTIVE BNE 28$ ;IF NE NO TST (R3)+ ;SKIP BUFFER SIZE FIELD IN DPB 28$: ;REFERENCE LABEL .IF DF S$$LIB MOV (R3)+,R2 ;PICK UP SPECIFIED AST ADDRESS CALL $CALTA ;CALCULATE PROPER AST ADDRESS MOV R2,(R4)+ ;SET PROPER AST ADDRESS (O.AST) .IFF MOV (R3)+,(R4)+ ;SET AST ADDRESS (O.AST) .ENDC MOV (SP)+,(R4)+ ;SET EVENT FLAG NUMBER (O.EFN) MOV R0,(R4) ;INDICATE 1/8 WORDS LONG MOV (R3)+,R0 ;PICK UP EXIT STATUS BLOCK ADDRESS BIS R0,(R4)+ ;SET EXIT STATUS BLOCK ADDRESS MOV T.NAM(R5),(R4)+ ;STORE PARENT TASK NAME (O.STAT) MOV T.NAM+2(R5),(R4)+ ;O.STAT+2 CLR (R4)+ ;INITIALIZE PROTECTION UIC CLR (R4)+ ;INITIALIZE DEFAULT UIC CLR (R4) ;INITIALIZE CONTEXT BLOCK POINTER TST R0 ;EXIT STATUS BLOCK SPECIFIED? BEQ 30$ ;IF EQ NO, BYPASS ADDRESS CHECK CALL $ACHCK ;ADDRESS CHECK EXIT STATUS BLOCK BCC 30$ ;IF CS ADDRESS CHECK OK 29$: JMP ADCER ;ADDRESS CHECK FAILURE 30$: CMPB $DICSV,#141. ;IS DIRECTIVE A (VAR) SEND, REQUEST & CONNECT? BEQ STRTSK ;IF EQ YES, BRANCH TO REQUEST TASK BLO 35$ ;IF LO IT IS SPAWN OR RPOI$ JMP SUCCESS ;IF HI IT IS CONNECT, RETURN SUCCESS STRTSK: CLR R4 ;PROPAGATE ISSUING TASK'S UIC MOV T.UCB(R5),R5 ;SET TI: UCB ADDRESS JMP RQST1 ;GO TO COMMON REQUEST CODE 35$: ;REFERENCE SYMBOL ; ; TI: DETERMINATION AND COMMAND LINE PROCESSING (SPWN). ; ; HERE THE TARGET TASK'S TI: IS DETERMINED FOR THE SUBSEQUENT REQUEST ; AND COMMAND LINE PROCESSING IS INITIATED. IF A TERMINAL UNIT ; HAS BEEN SPECIFIED, THEN IT IS VERIFIED AND ITS UCB IS FOUND. ; OTHERWISE THE ISSUING TASK'S UCB IS PROPAGATED. ; ; REGISTER CONTENTS AT THIS POINT: ; ; R3=PTR TO COMMAND LINE BUFFER ADDRESS IN THE DPB. ; R5=TCB ADDRESS OF CURRENT TASK ; 40$: MOV T.UCB(R5),R2 ;GET TI: UCB ADDRESS CMPB $DICSV+1,#14. ;CAN TI BE SOMETHING OTHER THAN VT? BLT 45$ ;IF LT NO TST 6(R3) ;WAS A DEVICE SPECIFIED? BEQ 45$ ;IF EQ NO CMP 6(R3),#"VT ;IS "VT" SPECIFIED BNE 64$ ;IF NE NO 45$: ;REFERENCE SYMBOL .IF DF V$$TRM MOVB 4(R3),R1 ;WAS A VIRTUAL TERMINAL UNIT SPECIFIED? BEQ 80$ ;IF EQ NO, DO COMMAND LINE PROCESSING MOV $VTDCB,R2 ;POINT TO FIRST CREATED VT: DCB 50$: CMPB D.UNIT(R2),R1 ;IS THIS THE UNIT SPECIFIED? BEQ 60$ ;IF EQ YES MOV (R2),R2 ;ELSE POINT TO NEXT DCB CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL DCB? BEQ 50$ ;IF EQ YES BR ILUER ;RETURN ERROR STATUS 60$: MOV D.UCB(R2),R2 ;POINT TO VT: UCB BIT #T3.CLI,T.ST3(R5) ;IS THE ISSUING TASK A CLI? BNE 80$ ;YES, LET IT THROUGH CMP R2,T.UCB(R5) ;IS THE ISSUING TASK ALREADY RUNNING ON THE VT? BEQ 80$ ;THAT'S OK TOO CMP U.PTCB(R2),R5 ;UNIT CREATED BY THIS PARENT? BNE ILUER ;IF NE NO .ENDC ;V$$TRM BR 80$ ;PERFORM COMMAND LINE PROCESSING 64$: MOV R3,R4 ;SAVE POINTER TO COMMAND LINE BUF IN DPB MOV 6(R3),R0 ;GET DEVICE NAME BEQ 45$ ;IF EQ, DEVICE NAME NOT SPECIFIED MOV 4(R3),R1 ;GET DEVICE UNIT NUMBER CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESS BCS ILUER ;IF CS DEVICE NOT FOUND BITB #US.OFL,U.ST2(R2) ;DEVICE OFFLINE? BNE PRVER ;IF NE YES BIT #DV.TTY,U.CW1(R2) ;IS SPECIFIED DEVICE A TERMINAL? BEQ ILUER ;IF EQ NO CMP R2,T.UCB(R5) ;IS CURRENT TASK'S TI: SPECIFIED BEQ 70$ ;IF EQ YES BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIV OR A CLI BEQ PRVER ;IF EQ NO 70$: MOV R4,R3 ;GET ADDRESS OF COMMAND LINE BUF 80$: MOV R2,R5 ;COPY UCB ADDRESS BR CMLPR ;DO COMMAND LINE PROCESSING .DSABL LSB ; ; LOCAL ERROR RETURN ROUTINES. ; ; THE FOLLOWING ROUTINES INTERFACE TO $DRTHR AND $ERREC FOR DIRECTIVE ; ERROR STATUS RETURNS AND ERROR RECOVERY. R5 IS USED TO STORE THE ; ERROR STATUS TRAP INSTRUCTION. ; ADCER: MOV (PC)+,R5 ;PICK UP ADDRESS CHECK ERROR STATUS DRSTS D.RS98 ; ERROR: JMP $ERREC ;THREAD THROUGH ERROR RECOVERY ILUER: MOV (PC)+,R5 ;PICK UP ILLEGAL DEVICE UNIT ERROR DRSTS D.RS92 ; BR ERROR ;RETURN ERROR STATUS PRVER: MOV (PC)+,R5 ;PICK PRIVILEGE VIOLATION ERROR DRSTS D.RS16 ; BR ERROR ;RETURN ERROR STATUS ILPARM: MOV (PC)+,R5 ;GET PARAMETER ILLEGAL FOR THIS TASK STATUS DRSTS D.RS8 ; BR ERROR ; NOTINS: MOV (PC)+,R5 ;GET TASK NOT INSTALLED ERROR DRSTS D.RS2 BR ERROR ; ; DEOCB - DEALLOCATES THE CONTEXT BLOCK IN THE OCB (IF ANY) ; BEFORE DEALLOCATING THE OCB ; DEOCB: .IF DF N$$DIR MOV R1,-(SP) ;SAVE SIZE OF OCB MOV O.STAT+10(R0),R1 ;GET CONTEXT BLOCK BEQ 10$ ;IF EQ, NONE CALL $DLCTX ;DEALL CONTEXT BLOCK 10$: MOV (SP)+,R1 ;RESTORE SIZE .ENDC ;DF N$$DIR JMP $DEACB ; ; COMMAND LINE PROCESSING FOR SPWN$ AND RPOI$ ; ; REGISTERS AT THIS POINT ; ; R3=POINTER TO COMMAND BUFFER ADDRESS IN DPB ; R5=TARGET TASK UCB ADDRESS CMLPR: MOV (R3),R0 ;COMMAND LINE SPECIFIED BEQ 80$ ;IF EQ NO MOV 2(R3),R1 ;GET LENGTH OF COMMAND BEQ 80$ ;IF EQ, EMPTY COMMAND LINE CMP #M$$XLN,R1 ;IS IT TOO LONG BLOS ADCER ;IF LOS YES CALL $ACHRO ;ADDRESS CHECK COMMAND LINE BCS ADCER ;IF CS, ADDRESS CHECK FAILURE MOV R3,$TEMP4 ;SAVE POINTER INTO DPB MOV 2(R3),R1 ;GET LENGTH OF COMMAND AGAIN ADD #C.CTXT+1+77,R1 ;ALLOW FOR HEADER, FINAL CR, AND ROUNDOFF ASH #-6,R1 ;CONVERT TO 32 WORD BLOCKS CALL @(SP)+ ;ALLOCATE A BUFFER FROM SECONDARY POOL .WORD $ALSEC ;ALLOCATION ROUTINE .WORD $DESEC ;DEALLOCATION ROUTINE BCC 10$ ;IF CC OK JMP ALLER ;ALLOCATION FAILURE 7$: MOV (PC)+,R5 ;PICK UP COMMAND LINE ERROR STATUS DRSTS D.RS2 ; BR ERROR ;RETURN ERROR STATUS 10$: MOV KISAR6,-(SP) ;SAVE POTENTIAL TCB MAPPING MOV $TEMP0,R2 ;GET OFFSPRING TCB MOV T.ST3(R2),R2 ;SAVE T.ST3 MOV R0,KISAR6 ;MAP SEC POOL BLOCK JUST ALLOCATED MOV #140004,R4 ;SET VIRT. ADDR TO REFERENCE BLOCK MOV R5,(R4)+ ;PUT UCB ADDRESS IN BLOCK MOV 2(R3),(R4)+ ;SET CHARACTER COUNT CLR -(SP) ;INIT STATUS WORD BIT #T3.CLI,R2 ;IS OFFSPRING TASK A CLI BEQ 30$ ;IF EQ NO .IF DF A$$CLI BIS #CC.CLI,(SP) ;SET CLI ONLY RETREIVAL .IFTF ;A$$CLI MOV $TEMP1,R2 ;POINT TO OCB (IF ANY) TO PASS BEQ 20$ ;IF EQ, NO OCB MOV R0,O.MCRL(R2) ;PUT COMMAND ADDRESS IN OCB 20$: TST $TEMP3 ;IS THIS AN RPOI$ DIRECTIVE BEQ 25$ ;IF EQ NO MOV $TKTCB,R2 ;GET TCB ADDRESS OF CURRENT TASK BIT #T3.CMD,T.ST3(R2) ;IS CURRENT TASK PART OF CLI COMMAND BEQ 25$ ;IF EQ NO BIS #CC.TTD,(SP) ;HAVE SYSTEM HANDLE AS IF FROM TTDRV 25$: ;REFERENCE LABEL .IFT ;A$$CLI CMP $TEMP0,$MCRPT ;IS COMMAND GOING TO DISPATCHER BNE 30$ ;IF NE NO CMP #^RMCR,-22(R3) ;WAS MCR... TARGET TASK NAME BNE 30$ ;IF NE NO (IT WAS CLI...) BIS #CC.MCR,(SP) ;SET FORCE TO MCR BIT .ENDC ;A$$CLI 30$: MOV (SP)+,(R4)+ ;SET STATUS WORD CLR (R4)+ ;INIT STARTING RETURN OFFSET FOR GMCR$ MOVB #33,(R4)+ ;ASSUME TERMINATOR MOVB R1,(R4)+ ;SET BLOCK ALLOCATE COUNT MOV (R3),R0 ;GET COMMAND TEXT ADDRESS CALL $RELOC ;RELOCATE USER ADDRESS SUB #20000,R2 ;CONVERT TO APR 5 MAPPING MOV 2(R3),R0 ;GET LENGTH MOV R0,-(SP) ;SAVE LENGTH MOV KISAR6,R3 ;GET DESTINATION APR6 BIAS CALL $BLXIO ;COPY COMMAND TEXT MOVB #15,(R4) ;TERMINATE WITH A CR MOV (SP),R1 ;GET LENGTH 40$: CMPB #33,-(R4) ;IS THIS CHAR A TERMINATOR BHIS 50$ ;IF HIS YES 45$: SOB R1,40$ ;LOOP TST (SP)+ ;CLEAN STACK BR 70$ ;NO EMBEDDED TERMINATORS 50$: BEQ 60$ ;IF EQ, AN ESC IS EMBEDDED CMPB #15,(R4) ;IS A CR EMBEDDED? BNE 45$ ;IF NE NO 60$: DEC R1 ;ADJUST COUNTER SUB R1,(SP) ;CALC DIFFERENCE IN LENGTHS SUB (SP)+,@#C.CCT+140000 ;CALC NUMBER OF CHARS NOW PRESENT BISB #200,(R4) ;FLAG TERMINATOR AS USER SUPPLIED MOVB (R4),@#C.CTR+140000 ;SET NEW TERMINATOR MOVB #15,(R4) ;FORCE TRAILING CHAR TO CR 70$: MOV R3,R1 ;GET ADDRESS OF SEC POOL BLOCK MOV (SP)+,KISAR6 ;RESTORE POTENTIAL TARGET TCB MAPPING MOV #$CLICQ,R0 ;POINT TO LISTHEAD OF COMMAND QUEUE CALL @(SP)+ ;PUSH ROUTINE TO REMOVE LINE FROM QUEUE .WORD NULL ;NOTHING TO DO NOW .WORD $GTSPK ;DEQUEUE ROUTINE MOV $TEMP4,R3 ;GET BACK POINTER TO CMD ADDR IN DPB MOV R1,$TEMP4 ;SAVE ADDRESS OF SEC POOL COMMAND BLOCK 80$: TST $TEMP4 ;IS A COMMAND LINE SUPPLIED BNE RQST ;IF NE YES MOV $TEMP0,R0 ;GET TARGET TCB BIT #T3.CLI,T.ST3(R0) ;IS TASK A CLI BNE 7$ ;IF NE YES, LI MUST HAVE A COMMAND ; ; COMMON REQUEST PROCESSING; ; ; HERE IS THE COMMON REQUEST PROCESSING FOR ALL DIRECTIVES IN THIS ; MODULE. THE DEFAULT AND PROTECTION UICS ARE DETERMINED, AND THE ; NAME OF THE TASK CALCULATED IF NECESSARY. FOR ALL DIRECTIVES EXCEPT ; THE RPOI$, THIS IS BASED ON THE TARGET TASK NAME AT OFFSET ; 2 IN THE DPB. THE RPOI$ DIRECTIVE ALLOWS A SPECIFIC NAME ; FOR THE OFFSPRING TO BE SPECIFIED. THIS CAN ONLY BE DONE IF THE ; ORIGINAL TARGET HAD A NAME OF THE FORM ...XXX. IF THE NEW NAME ; IS NOT OF THE ...XXX FORM, IT IS USED AS IS. IF THE NEW SPECIFIED ; NAME IS OF THE ...XXX FORM, THE APPROPRIATE FORM OF THE NAME ; FOR THE TASK'S TI:UCB IS CALCULATED AND USED. ; THE TASK IS THEN REQUESTED VIA $TSKRP, UNLESS IT IS A CLI WITH ; A NAME NOT IN THE ...XXX FORM. THESE CLI TASKS ARE REQUESTED BY ; $EXRQN WHICH IS CALLED BY THE COMMAND QUEUEING ROUTINE. ; ; REGISTERS AT THIS POINT ; ; R3=POINTER TO CMD TEXT ADDRESS IN DPB ; R5=TI:UCB ADDRESS ; RQST: MOV -10(R3),R4 ;GET REQUEST UIC RQST1: MOV $TEMP0,R0 ;GET TARGET TCB ADDRESS RQST2: TST $TEMP3 ;IS THIS AN RPOI$ OR SDRP$ DIRECTIVE BEQ 30$ ;IF EQ NO CMPB $DICSV,#141. ;IS THIS AN SDRP$ BEQ 30$ ;IF EQ YES ADD #10,R3 ;POINT TO SPECIFIED NAME FIELD TST (R3) ;WAS A NAME SPECIFIED BEQ 30$ ;IF NE NO ; ; HANDLE SPECIFIED NAME FOR RPOI$ ; .IF DF A$$CLI BIT #T3.CLI,T.ST3(R0) ;IS TARGET A CLI BNE 10$ ;IF NE YES, CANNOT RENAME A CLI .ENDC ;A$$CLI CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU NAME BEQ 15$ ;IF EQ YES 10$: JMP ILPARM ;ILLEGAL PARAMETER ERROR 15$: ; CMP #^R...,(R3) ;IS NEW NAME MU TYPE BNE 20$ ;IF NE NO MOV R5,R0 ;SET ADDRESS OF DESIRED UCB MOV 2(R3),R1 ;GET NEW NAME CALL $SRMUT ;CALC NEW NAME BCC 25$ ;IF CC, IT ALREADY EXISTS BR 40$ ;CREATE IT 20$: CALL $SRSTD ;DOES SPECIFIED TASK EXIST BCS 40$ ;IF CS NO 25$: CMP $TKTCB,R0 ;DID WE FIND TASK ISSUING DIRECTIVE BNE 60$ ;IF NE NO, USE THIS TCB CMP #1,$TEMP3 ;IS CURRENT TASK GOING TO EXIT IN DIRECTIVE BNE 40$ ;IF NE YES JMP TSKACT ;TASK ACTIVE ERROR ; ; CALCULATE TASK NAME FOR ALL CASES OTHER THAN RPOI$ WITH A SPECIFIED NAME ; 30$: CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU TYPE NAME BEQ 35$ ;IF EQ, YES CMP #140000,R0 ;TCB IN SEC POOL? BHI 70$ ;IF HIGH, NO JMP NOTINS ;OTHERWISE, ERROR 35$: MOV T.NAM+2(R0),R1 ;GET HALF OF NEW NAME MOV R5,R0 ;GET DESIRED TI: UCB CALL $SRMUT ;CALC NEW NAME BCC 60$ ;IF CC, IT ALREADY EXISTS ; ; THE DESIRED TCB DOES NOT EXIST, SO IT MUST BE CREATED ; 40$: MOV #T.LGTH,R1 ;GET LENGTH OF TCB CALL $ALOCB ;ALLOCATE ONE BCC 45$ ;IF CC, OK JMP ALER1 ;IF CS, NO POOL 45$: MOV $TEMP0,R1 ;GET PROTOTYPE TCB ADDRESS CMP #120000,R1 ;IS PROTOTYPE IN PRIMARY POOL BHI 50$ ;IF HI YES MOV #$PTCPT+1,R1 ;POINT TO APR BIAS 50$: MOV R4,$TEMP0 ;PRESERVE REQUEST UIC AGAIN CALL @(SP)+ ;INSTALL NEW TCB WITH TRAIL TO REMOVE .WORD $TCBCP ;COPY AND INSTALL .WORD $REMO1 ;REMOVE AND DEALLOCATE MOV $TEMP0,R4 ;GET REQUEST UIC BACK 60$: MOV R0,$TEMP0 ;USE NEW TCB FROM NOW ON .IF DF A$$CLI INC R5 ;REMEMBER THAT ORIGINAL HAD MU TYPE NAME .IFTF ;A$$CLI ; ; PUT TCB ADDRESS IN COMMAND BUFFER, AND START TASK ; 70$: MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTS BEQ 72$ ;IF EQ, NO COMMAND MOV R0,@#C.CTCB+140000 ;PUT TCB ADDRESS IN COMMAND 72$: ;REFERENCE LABEL .IF DF N$$DIR ;NAMED DIRECTORIES MOV R5,R1 ;COPY UCB ADDRESS BIC #1,R1 ;INSURE UCB IS EVEN CMPB $DICSV+1,#16. ;IS IT AN RPOI$ BEQ 80$ ;IF EQ YES BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI? BEQ 80$ ;IF EQ, NO MOV $TEMP1,R2 ;GET OCB, IF ANY BEQ 80$ ;IF EQ, NO OCB MOV $TKTCB,R3 ;GET CURRENT TCB CMP R1,T.UCB(R3) ;SPAWNED TASK TI: SAME AS SPAWNING TASK? BEQ 73$ ;IF EQ, YES BIT #DV.PSE,U.CW1(R1) ;IS THIS A PSEUDO DEVICE? BNE 73$ ;IF NE, YES MOV U.CTX(R1),R1 ;USE CONTEXT FROM TARGET UCB BR 75$ 73$: MOV T.CTX(R3),R1 ;USE CONTEXT FROM CURRENT TCB 75$: MOV R1,O.STAT+10(R2) ;PUT CONTEXT POINTER INTO OCB BEQ 80$ ;IF EQ, NO CONTEXT BLOCK MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV R1,KISAR6 ;MAP THE CONTEXT BLOCK INCB C.REF+140000 ;INCREMENT REFERENCE COUNT MOV (SP)+,KISAR6 ;RESTORE MAPPING .IFF ;DF N$$DIR CMPB $DICSV+1,#16. ;IS IT AN RPOI$ BEQ 80$ ;IF EQ YES MOV $TEMP1,R2 ;GET OCB, IF ANY BEQ 80$ ;IF EQ, NO OCB CLR O.STAT+10(R2) ;CLEAR CONTEXT BLOCK POINTER .ENDC ; DF N$$DIR 80$: MOV R4,R1 ;SET REQUEST UIC MOV R4,-(SP) ;SAVE REQUEST UIC CALL UISET ;CALC PROT/DEF UICS MOV (SP)+,R4 ;RESTORE REQUEST UIC BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI BEQ 90$ ;IF EQ NO .IFT ;A$$CLI BIT #1,R5 ;MU NAME TYPE CLI BNE 90$ ;IF NE YES .IFTF ;A$$CLI TST R4 ;WAS UIC SPECIFIED IN ORIGINAL DPB? BEQ 85$ ;IF EQ NO MOV $TEMP1,R2 ;GET OCB ADDR IF ANY BEQ 85$ ;IF EQ, NO OCB MOV R1,O.STAT+4(R2) ;SET PROTECTION UIC MOV R3,O.STAT+6(R2) ;SET DEFAULT UIC 85$: MOV $TEMP4,R1 ;POINT TO COMMAND BEQ 90$ ;IF EQ, NO COMMAND FROM RQST$ DIRECTIVE CALL $QCPKT ;QUEUE COMMAND AND REQUEST CLI BCC SUCCES ;IF CC, CLI STARTED OK BEQ SUCCES ;IF CC, CLI ALLOWED TO BE ACTIVE BR ALER1 ;POOL ALLOCATION FAILURE ; ; 90$: .IFT ;A$$CLI BIC #1,R5 ;INSURE EVEN UCB ADDRESS .ENDC ;A$$CLI MOV $TKTCB,R2 ;GET ISSUER'S TCB ADDRESS .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT CMP R5,T.UCB(R2) ;SPAWNED TASK TI: SAME AS SPAWNING TASK? BEQ 93$ ;IF EQ, YES BIT #DV.PSE,U.CW1(R5) ;IS THIS A PSEUDO DEVICE? BNE 93$ ;IF NE, YES MOV U.CTX(R5),$CTXPT ;USE CONTEXT FROM TARGET UCB BR 95$ 93$: MOV T.CTX(R2),$CTXPT ;PROPAGATE ISSUING TASK'S DDS .ENDC ;DF N$$DIR 95$: CMP $TEMP3,#1 ;WILL THE CURRENT TASK BE EXITING? BLOS 97$ ;IF LOS NO BIS #T2.HLT,T.ST2(R2) ;PREVENT A POSSIBLE CHECKPOINT 97$: MOV #100$,-(SP) ;ASSUME SUCCESS MOV R5,R2 ;GET TARGET UCB ADDR MOV R0,R5 ;SAVE TCB ADDRESS CALL $TSKRP ;REQUEST THE TASK BCC 99$ ;IF CC, OK BEQ 98$ ;IF EQ, ALLOCATION SUCCEEDED MOV #ALER1,(SP) ;ELSE PROCESS ERROR BR 99$ ;AFTER CLEANUP 98$: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI? BNE 99$ ;IF NE YES, IT CAN BE ACTIVE CMPB $DICSV,#141. ;SDRC$ OR SDRP$? BEQ 99$ ;IF EQ, TASK ACTIVE OK MOV #TSKACT,(SP) ;ELSE TASK ACTIVE ERROR 99$: MOV $TKTCB,R1 ;GET ISSUER'S TCB ADDRESS BIC #T2.HLT,T.ST2(R1) ;RESET EXITING CONDITION RETURN ; BELIEVE IT OR NOT, THIS CODE REACHES DOWN INTO THE BOWELS OF THE RECOVERY ; THREADS ON THE STACK AND CHECKS FOR A REFERENCE TO $REMOV TO INDICATE ; SUCCESS. IT NOW LOOKS FOR $REMO1, BUT ANY FURTHER PROBLEMS IN THIS AREA, ; THIS IS A GOOD PLACE TO START LOOKING. 100$: CMP 6(SP),#$REMO1 ;WAS TCB CREATED BNE 110$ ;IF NE NO BIS #T3.REM,T.ST3(R5) ;SET REMOVE ON EXIT BIT 110$: MOV $TEMP4,R1 ;POINT TO COMMAND BUFFER BEQ SUCCES ;IF EQ, NO COMMAND CALL $QCLNR ;QUEUE COMMAND TO TASK BR SUCCES ;FINISH UP PROCESSING .ENABL LSB ALLER: ADD #6,SP ;POP THREAD TO DEALLOCATE ROUTINE ALER1: MOV (PC)+,R5 ;PICK UP ALLOCATION FAILURE STATUS DRSTS D.RS1 ; BR 10$ TSKACT: MOV (PC)+,R5 ;PICK UP TASK ACTIVE ERROR STATUS DRSTS D.RS7 ; 10$: JMP ERROR ;RETURN ERROR STATUS .DSABL LSB ; ; THE TARGET TASK HAS BEEN SUCCESSFULLY STARTED. FROM THIS POINT ON, ; NOTHING CAN GO WRONG. IRREVERSIBLE ACTIONS SUCH AS PROPOGATING ; PROMPT REQUEST BITS AND CHANGING OCB LINKAGES CAN NOW BE DONE ; SINCE THEY CANNOT GENERATE AN ERROR, AND THE DIRECTIVE MUST SUCCEED. ; SUCCES: MOV $TEMP0,R4 ;GET TARGET TCB ADDRESS ADD #T.OCBH,R4 ;POINT TO ITS OCB LIST MOV $TEMP1,R1 ;POINT TO ANY OCB(S) MOV $TEMP3,R5 ;RPOI$ OR SDRP$ DIRECTIVE? BEQ 30$ ;IF EQ NO MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADD #T.OCBH,R0 ;POINT TO ITS OCB LIST CMP #1,R1 ;PASS ALL OCBS BEQ 10$ ;IF EQ YES MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 OF CURRENT TASK BIS T.ST3-T.OCBH(R4),(SP) ;PUT T.ST3 OF TARGET ON TOP OF IT BIT #T3.CLI,(SP)+ ;IS EITHER TASK A CLI BEQ 20$ ;IF EQ NO 10$: CALL PSPRMT ;PASS PROMPT CONTROL INFO 20$: CMP #1,R1 ;DETERMINE HOW TO HANDLE OCB(S) BHI 70$ ;IF HI, NO OCB BEQ 50$ ;IF EQ, PASS ALL OCB(S) CALL $QRMVA ;REMOVE OCB FROM CURRENT TASK (MUST BE THERE) BR 40$ ; 30$: TST R1 ;ANY OCB BEQ 80$ ;IF EQ NO MOV O.PTCB(R1),R2 ;GET PARENT TASK TCB ADDRESS INC T.RDCT(R2) ;INCREMENT RUNDOWN COUNT 40$: MOV R4,R0 ;POINT TO TARGET OCB QUEUE CALL $QINSF ;INSERT OCB IN QUEUE BR 70$ ;ALL DONE 50$: MOV (R0),R1 ;GET ADDRESS OF FIRST OCB OFF CURRENT TASK BEQ 70$ ;IF EQ, NO OCBS EXIST CLR (R0) ;FORICIBLY EMPTY LIST MOV R0,2(R0) ;SET SECOND HALF OF LISTHEAD MOV R1,@2(R4) ;LINK AFTER PREVIOUS LAST OCB FROM TARGET 60$: MOV R1,2(R4) ;SET POINTER TO NEW LAST ENTRY MOV (R1),R1 ;POINT TO NEXT OCB IN QUEUE BNE 60$ ;IF NE, THERE IS ANOTHER SO UPDATE POINTER 70$: MOV $TEMP4,KISAR6 ;MAP COMMAND LINE IF IT EXISTS BEQ 75$ ;IF EQ NO COMMAND LINE BICB #200,@#C.CTR+140000 ;ELIM USER TERMINATOR INDICATOR 75$: CMP #1,R5 ;FORCE CURRENT TASK TO EXIT? BHIS 80$ ;IF HIS NO MOV R5,SP ;POINT STACK BACK TO RETURN ADDR TO DRDSP MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS CALLR $DREXT ;FORCE CURRENT TASK TO EXIT 80$: DRSTS +1 ;THE END ;+ ; **-$DREXS-EXIT WITH STATUS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PASS A STATUS WORD TO ALL ; PARENT TASKS AND EXIT. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(29.),DPB SIZE(2.) ; WD. 01 -- STATUS WORD. ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE STATUS WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE ; TERMINATES ITS EXECUTION. ;- $DREXS::BIT #T3.ACP,T.ST3(R5) ;IS THIS AN ACP? BNE 5$ ;IF NE YES MOV (R3),T.EFLG+2(R5) ;SET EXIT STATUS IN TCB 5$: CALLR $DREX2 ;INITIATE TASK EXIT ;+ ; **-$DREMS-EMIT STATUS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EMIT A STATUS WORD TO ALL ; OR A SPECIFIED PARENT TASK WITHOUT EXITTING. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(147.),DPB SIZE(4.). ; WD. 01 -- FIRST WORD OF PARENT TASK NAME OR 0 FOR ALL. ; WD. 02 -- SECOND WORD OF PARENT TASK NAME. ; WD. 03 -- STATUS WORD. ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE PARENT TASK NAME IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIED ; TASK IS NOT A PARENT OF THE ISSUING TASK. ;- $DREMS::MOV 4(R3),-(SP) ;SAVE SPECIFIED STATUS WORD CMP (R3),#^R... ;IS SPECIFIED TASK MULTI-USER? BNE 10$ ;IF NE NO MOV T.UCB(R5),R0 ;PICK UP UCB ADDRESS FOR $SRMUT MOV 2(R3),R1 ;PICK UP SECOND WORD OF SPECIFIED NAME CALL $SRMUT ;CALCULATE TASK NAME (IGNORING C-BIT) 10$: MOV R3,R4 ;COPY TASK NAME POINTER 20$: MOV R5,R0 ;COPY ISSUING TASK TCB POINTER ADD #T.OCBH,R0 ;POINT TO OCB QUEUE MOV R0,R1 ;COPY LISTHEAD POINTER 30$: MOV (R1),R1 ;POINT TO NEXT IN QUEUE BEQ 60$ ;IF EQ THERE IS NONE TST (R4) ;TASK NAME SPECIFIED? BEQ 40$ ;IF EQ YES (PASSING STATUS TO ALL) CMP (R4),O.STAT(R1) ;MATCH ON FIRST WORD OF TASK NAME? BNE 30$ ;IF NE NO CMP 2(R4),O.STAT+2(R1) ;MATCH ON SECOND WORD OF TASK NAME? BNE 30$ ;IF NE NO 40$: CALL $QRMVA ;REMOVE THE ENTRY MOV (SP),R0 ;PICK UP SPECIFIED STATUS WORD MOV #S.CACT,R2 ;SET ABORT CODE OF "TASK STILL ACTIVE" CALL $QUEXT ;QUEUE THE OCB TO PARENT TASK TST (R4) ;PASSING STATUS TO ALL PARENTS? BEQ 20$ ;IF EQ YES 50$: TST (SP)+ ;CLEAN STACK RETURN ; 60$: TST (R4) ;WAS A TASK NAME SPECIFIED? BEQ 50$ ;IF EQ NO DRSTS D.RS8 ;INCONSISTENT WITH CURRENT TASK STATE ; ; LOCAL ROUTINES. ; ; ; ROUTINE TO INITIALIZE ERROR RECOVERY FOR CONNECT, REQUEST, SEND ; REQUEST AND CONNECT, AND SPAWN. ; ERRSV: MOV R0,$TEMP0 ;SAVE TARGET TCB ADDRESS CLR $TEMP1 ;INITIALIZE OCB POINTER CLR $TEMP4 ;INITIALIZE POINTER TO CMD BLOCK JMP $DRTHR ;INITIALIZE ERROR RECOVERY THREADING ; ; THIS ROUTINE CALCULATES THE DEFAULT AND PROTECTION UICS FOR ; THE CURRENT TASK ; ; INPUTS: ; R1=REQUEST UIC ; ; OUTPUTS: ; R1=PROTECTION UIC ; R3=DEFAULT UIC ; R4=ADDRESS OF CURRENT TASK'S HEADER ; ; R0 IS PRESERVED ; UISET: MOV $TKTCB,R2 ;GET CURRENT TASK TCB ADDRESS ADD #T.ST2,R2 ;POINT TO TASK STATUS WORD .IF DF X$$HDR MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFF MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER CALLR $UISET ;CALCULATE DEF/PROT UICS .IFT CALL $UISET ;CALCULATE DEF/PROT UICS MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING RETURN ; .ENDC ; ; THIS ROUTINE PASSES THE PROMPTING CONTROL BIT (T3.MCR) AND THE CLI; ; COMMAND EXECUTION INDICATOR BIT (T3.CMD) FROM THE CURRENT TASK TO ; THE TARGET. IT IS CALLED ONLY IF THE CURRENT TASK HAS PASSED ALL ; ITS OCBS TO THE TARGET, OR IF EITHER THE CURRENT OR TARGET IS A CLI. ; THE TERMINATOR CHARACTER IN THE COMMAND BUFFER (IF IT EXISTS) ; IS SET TO A CARRIAGE RETURN IF THE T3.MCR BIT IS TURNED ON IN THE ; TARGET TCB ; ; INPUTS: ; ; R0=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN CURRENT TASK'S TCB ; R4=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN TARGET TASK'S TCB ; ; OUTPUTS: ; ; THE STATUS BITS ARE PROPOGATED TO THE TARGET TASK TCB ; ; ALL REGISTERS PRESERVED ; PSPRMT: MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 FROM CURRENT TASK BIC #^C,(SP) ;CLEAR ALL BUT BITS OF INTEREST BIC (SP),T.ST3-T.OCBH(R0) ;CLEAR BITS IN CURRENT TASK .IF DF A$$CLI BIT #T3.CLI,T.ST3-T.OCBH(R4) ;IS TARGET TASK A CLI BNE 5$ ;IF NE YES .ENDC ;A$$CLI BIC #T3.MCR!T3.CMD,T.ST3-T.OCBH(R4) ;CLEAR BITS IN TARGET BIS (SP),T.ST3-T.OCBH(R4) ;SET TARGET'S BITS LIKE CURRENT WAS 5$: BIT #T3.MCR,(SP)+ ;WILL CURRENT ISSUE PROMPT ON EXIT BEQ NULL ;IF EQ NO MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTS BEQ 10$ ;IF EQ, NO COMMAND BITB #200,@#C.CTR+140000 ;WAS TERM USER SUPPLIED? BNE 10$ ;IF NE YES, DON'T CHANGE IT MOVB #15,@#C.CTR+140000 ;SET TERMINATOR TO BE CR 10$: MOV (SP)+,KISAR6 ;RESTORE MAPPING NULL: RETURN ; ; THIS ROUTINE LOCATES THE OCB(S) TO BE PASSED BY THE RPOI$ AND SDRP$ ; DIRECTIVES. ; ; INPUTS: ; ; R2=FLAGS BYTE ; R3=ADDRESS OF THE PARENT'S TASK NAME IN THE DPB ; ; ; OUTPUTS: ; ; $TEMP1 IS SET WITH THE ADDRESS OF THE OCB TO PASS, CLEAR IF ; NO OCB IS TO BE PASSED, OR ONE TO PASS ALL OCBS ; LOCOCB: MOV (SP)+,R4 ;RETURN ADDR TO ALLOW ERROR THREAD TO WORK ASR R2 ;PASS ALL OCBS BCS 5$ ;IF CS YES ASR R2 ;PASS NEXT OCB IN QUEUE? BCS 80$ ;IF CS YES BR 10$ ;CHECK IF SPECIFIC PARENT IS NAMED 5$: ; MOV $TEMP0,R2 ;POINT TO OBJECT TASK BIT #T3.CLI,T.ST3(R2) ;IS TASK A CLI BNE 100$ ;IF NE YES, ILLEGAL MOV (R3),-(SP) ;WAS PARENT NAME SUPPLIED BIS 4(R3),(SP)+ ;OR AN OCB ADDRESS BNE 120$ ;IF NE YES INC $TEMP1 ;INDICATE PASS ALL BR 70$ ;ALL DONE 10$: MOV $TKTCB,R2 ;POINT TO CURRENT TASK'S TCB ADD #T.OCBH,R2 ;ITS OCB LISTHEAD .IF DF A$$CLI BIT #T3.CLI,T.ST3-T.OCBH(R2) ;IS ISSUING TASK A CLI BEQ 30$ ;IF EQ NO TST (R3) ;WAS A SPECIFIC PARENT REQUESTED BNE 40$ ;IF NE YES TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIED BEQ 70$ ;IF EQ NO 20$: MOV (R2),R2 ;POINT TO THE NEXT OCB BEQ 110$ ;IF EQ, THERE ARE NO MORE CMP 4(R3),R2 ;IS THIS THE SPECIFIED OCB BNE 20$ ;IF NE NO BR 60$ ; .ENDC ;A$$CLI 30$: TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIED BNE 100$ ;IF NE YES TST (R3) ;WAS A SPECIFIC PARENT REQUESTED BEQ 70$ ;IF EQ NO 40$: MOV (R2),R2 ;POINT TO NEXT OCB IN LIST BEQ 110$ ;IF EQ, THERE ARE NO MORE CMP O.STAT(R2),(R3) ;IS THIS THE OCB FOR THE CORRECT PARENT BNE 40$ ;IF NE NO CMP O.STAT+2(R2),2(R3) ;MAYBE?? BNE 40$ ;IF NE NO TST 4(R3) ;HAS OCB ADDR BEEN SPECIFIED BEQ 60$ ;IF EQ NO CMP 4(R3),R2 ;DID THEY FIND THE SAME OCB BNE 120$ ;IF NE NO 60$: MOV R2,$TEMP1 ;SAVE ADDR OF OCB TO PASS 70$: JMP (R4) ;RETURN 80$: MOV (R3),-(SP) ;GET PARENT NAME IF SPECIFIED BIS 4(R3),(SP)+ ;WAS OCB ADDRESS SPECIFIED BNE 120$ ;IF NE YES, CANNOT SPECIFIY EITHER MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASK MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANY JMP (R4) ;RETURN ; ; ERROR HANDLING ; 100$: JMP ILPARM ;THIS TASK CANNOT USE THIS PARAMETER 110$: MOV (PC)+,R5 ;PICK UP SPECIFIED OCB DOESN'T EXIST STA DRSTS D.RS86 ; BR 150$ ;RETURN ERROR STATUS 120$: MOV (PC)+,R5 ;PICK UP NAME AND OCB ADDR DON'T MATCH S DRSTS D.RS84 ; 150$: JMP ERROR ;ISSUE ERROR .END